#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import os
import tinify
import logging

# 配置 tinify API key
tinify.key = "NyKyXWRvFD2z8ZKrHVPww0gQvb5hHcsC"  # API KEY
version = "1.0.1"  # 版本

# 配置日志记录
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")

# 压缩的核心函数
def compress_core(inputFile, img_width):
    try:
        logging.info(f"开始压缩: {inputFile}")  # 打印正在压缩的文件名称
        source = tinify.from_file(inputFile)
        
        # 获取原文件的修改时间（用于判断文件是否已经压缩过）
        original_mtime = os.path.getmtime(inputFile)

        # 判断图片是否需要调整尺寸
        if img_width != -1:
            resized = source.resize(method="scale", width=img_width)
            resized.to_file(inputFile)  # 直接覆盖原文件
        else:
            source.to_file(inputFile)  # 直接覆盖原文件

        # 获取压缩后的文件修改时间
        compressed_mtime = os.path.getmtime(inputFile)

        # 比较文件修改时间，判断文件是否被压缩过
        if compressed_mtime != original_mtime:
            logging.info(f"压缩完成: {inputFile}")
        else:
            logging.info(f"文件未改变: {inputFile}")

    except Exception as e:
        logging.error(f"压缩失败: {inputFile}，错误: {e}")

# 压缩文件夹下的图片并替换原文件
def compress_path(path, width):
    if not os.path.isdir(path):
        logging.error(f"路径 {path} 不是有效的文件夹!")
        return

    logging.info(f"正在处理文件夹: {path}")
    for root, dirs, files in os.walk(path):
        logging.info(f"处理目录: {root}")
        
        # 遍历当前目录中的所有文件
        for name in files:
            file_name, file_suffix = os.path.splitext(name)
            
            if file_suffix.lower() in ['.png', '.jpg', '.jpeg']:
                file_path = os.path.join(root, name)

                # 如果文件是不可写的，跳过处理
                if not os.access(file_path, os.W_OK):
                    logging.warning(f"文件不可写，跳过: {file_path}")
                    continue

                logging.info(f"开始压缩文件: {file_path}")
                compress_core(file_path, width)

        # 这里不再限制只遍历当前目录，确保处理所有子目录
        # break  # 仅遍历当前目录 (不再需要)

# 仅压缩指定文件并替换原文件
def compress_file(inputFile, width):
    if not os.path.isfile(inputFile):
        logging.error(f"{inputFile} 不是有效文件!")
        return

    file_name, file_suffix = os.path.splitext(inputFile)
    if file_suffix.lower() in ['.png', '.jpg', '.jpeg']:
        logging.info(f"开始压缩文件: {inputFile}")
        compress_core(inputFile, width)
    else:
        logging.warning(f"不支持的文件类型: {inputFile}")

def run():
    # 指定文件或文件夹路径
    file = None  # 如果不指定文件，改为 None
    #dir = r"D:\\NewProject_9\\assets\\ffff"  # 修改为目标文件夹路径
    dir = r"D:\\dage\\stg_client\\assets\\theme022\\home\\spine"
    width = -1  # 设置图片的宽度，如果不需要改变，设为 -1
    logging.info(f"GcsSloop TinyPng V{version}")

    if file is not None:
        compress_file(file, width)  # 仅压缩一个文件
    elif dir is not None:
        compress_path(dir, width)  # 压缩指定目录下的文件，包括子文件夹
    else:
        compress_path(os.getcwd(), width)  # 压缩当前目录下的文件

    logging.info("结束!")

if __name__ == "__main__":
    run()
